package LeetCodeQuestionBank;

import java.util.ArrayList;
import java.util.List;

/**
 * 784. 字母大小写全排列
 * 给定一个字符串 s ，通过将字符串 s 中的每个字母转变大小写，我们可以获得一个新的字符串。
 *
 * 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
 *
 *
 *
 * 示例 1：
 *
 * 输入：s = "a1b2"
 * 输出：["a1b2", "a1B2", "A1b2", "A1B2"]
 * 示例 2:
 *
 * 输入: s = "3z4"
 * 输出: ["3z4","3Z4"]
 *
 *
 * 提示:
 *
 * 1 <= s.length <= 12
 * s 由小写英文字母、大写英文字母和数字组成
 */
public class T784 {
    public List<String> letterCasePermutation(String s) {
        ArrayList<String> res = new ArrayList<>();
        char[] chars = s.toCharArray();

        dfs(res, "", 0, s);

        return res;

    }

    /**
     * 深度遍历 拼接字符 每个字母只有两种可能 大写或者小写
     * @param res 结果集
     * @param temp 单次结果
     * @param startIndex 记录位置
     * @param s 原始字符串
     */
    public void dfs(ArrayList<String> res, String temp, int startIndex, String s) {

        if (temp.length() == s.length()) {
            res.add(temp);
            return;
        }


        char c = s.charAt(startIndex);

        if ('A' <= s.charAt(startIndex) && s.charAt(startIndex) <= 'z') {
            //翻转大小写
            char C = (char) (c >= 'a' ? c - 32 : c + 32);

            //深度遍历
            dfs(res, temp + c, startIndex + 1, s);
            dfs(res, temp + C, startIndex + 1, s);


        } else {

            dfs(res, temp + c, startIndex + 1, s);
        }

    }

    public static void main(String[] args) {
        T784 t784 = new T784();
        List<String> a1b2 = t784.letterCasePermutation("a1b2");
        for (String s : a1b2) {
            System.out.println(s);
        }
    }
}
